package com.efrei.schoolmanager.controlers;

import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Session;

import com.efrei.schoolmanager.exceptions.LogicException;
import com.efrei.schoolmanager.model.hibernate.dao.ClasseDAO;
import com.efrei.schoolmanager.model.hibernate.dao.EleveDAO;
import com.efrei.schoolmanager.model.hibernate.dao.EnseignantDAO;
import com.efrei.schoolmanager.model.hibernate.dao.MatiereDAO;
import com.efrei.schoolmanager.model.hibernate.dao.NiveauDAO;
import com.efrei.schoolmanager.model.obj.Classe;
import com.efrei.schoolmanager.model.obj.Eleve;
import com.efrei.schoolmanager.model.obj.Enseignant;
import com.efrei.schoolmanager.model.obj.Matiere;
import com.efrei.schoolmanager.model.obj.Niveau;

/**
 * gére la gestion des classes avec leurs matieres, niveaux, etc
 * 
 * @see ControleurTransactionnel
 */
public class ControleurClasse extends ControleurTransactionnel {

	// dao(s)
	private final ClasseDAO classeDao;
	private final EnseignantDAO enseignantDao;
	private final MatiereDAO matiereDao;
	private final NiveauDAO niveauDao;
	private final EleveDAO eleveDao;
	// les données
	private List<Classe> classes;
	private List<Enseignant> enseignants;
	private List<Matiere> matieres;
	private Classe currentClasse;
	private List<Niveau> niveaux;
	private List<Eleve> eleves;

	public ControleurClasse() throws HibernateException, LogicException {
		super();

		Session session = getSession();
		classeDao = new ClasseDAO(session);
		enseignantDao = new EnseignantDAO(session);
		matiereDao = new MatiereDAO(session);
		niveauDao = new NiveauDAO(session);
		eleveDao = new EleveDAO(session);
	}

	public List<Classe> getClasses() {
		if (classes == null)
			classes = classeDao.getClasses();
		return classes;
	}

	public List<Enseignant> getEnseignants() {
		if (enseignants == null)
			enseignants = enseignantDao.getEnseignants();
		return enseignants;
	}

	public List<Matiere> getMatieres() {
		if (matieres == null)
			matieres = matiereDao.getMatieres();
		return matieres;
	}

	public List<Niveau> getNiveaux() {
		if (niveaux == null)
			niveaux = niveauDao.getNiveaux();
		return niveaux;
	}

	public List<Eleve> getEleves() {
		if (eleves == null)
			eleves = eleveDao.getEleves();
		return eleves;
	}

	/**
	 * ajoute une classe a la liste des classes
	 * 
	 * @param nom
	 * @param promotion
	 * @param niveau
	 * @throws LogicException
	 */
	public void addClasse(String nom, int promotion, Niveau niveau)
			throws LogicException {
		getClasses().add(new Classe(nom, promotion, niveau));
	}

	@Override
	public void validAndQuit() throws LogicException {
		for (Classe classe : classes) {
			classeDao.saveOrUpdate(classe);
		}
		super.validAndQuit();
	}

	public static Classe test(ControleurClasse controler) {
		return controler.getClasses().get(0);
	}

	public Classe getCurrentClasse() {
		return currentClasse;
	}

	public void setCurrentClasse(Classe currentClasse) {
		this.currentClasse = currentClasse;
	}

}
